package modulo3.model;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Calendar;

/**
 *
 * @author jjsanche
 */
public class Recordatorio implements Externalizable {
    private String descripcion;
    private Calendar fechaDeRegistro;
    private Calendar fechaDeTermino;
    private Prioridad prioridad;
    
    public Recordatorio() {
    }
    
    /**
     *
     */
    public Recordatorio(String descripcion, Prioridad prioridad) {
        this.descripcion = descripcion;
        this.prioridad = prioridad;
        fechaDeRegistro = Calendar.getInstance();
    }
    
    public Recordatorio(String descripcion) {
        this(descripcion, Prioridad.NORMAL);
    }
    
    public Recordatorio(Object valor, AtributoRecordatorio atributo) {
        if (atributo == AtributoRecordatorio.FECHA_REGISTRO) {
            this.fechaDeRegistro = (Calendar) valor;
        } else if (atributo == AtributoRecordatorio.FECHA_TERMINO) {
            this.fechaDeTermino = (Calendar) valor;
        } else {
            this.prioridad = (Prioridad) valor;
        }
    }
    
    public void writeExternal(ObjectOutput oo) throws IOException{

        oo.writeObject(descripcion);
        
        byte year = (byte)(fechaDeRegistro.get(Calendar.YEAR) % 100);
        byte month = (byte) fechaDeRegistro.get(Calendar.MONTH);
        byte year_month = (byte) (year << 1 | month >> 3);
        byte day = (byte) fechaDeRegistro.get(Calendar.DAY_OF_MONTH);
        byte month_day = (byte) (month << 5 | day);
        
        oo.writeByte(year_month);
        oo.writeByte(month_day);
        
        if (fechaDeTermino == null) {
            oo.writeByte(-1);
        } else {
            oo.writeByte(fechaDeTermino.get(Calendar.YEAR));
            oo.writeByte(fechaDeTermino.get(Calendar.MONTH));
            oo.writeByte(fechaDeTermino.get(Calendar.DAY_OF_MONTH));
        }
        
        oo.writeByte(prioridad.getValue());
    }
    
    public void readExternal(ObjectInput oi) throws IOException, ClassNotFoundException {
        descripcion = (String) oi.readObject();
        fechaDeRegistro = Calendar.getInstance();
        
        byte year_month = oi.readByte();
        byte month_day = oi.readByte();
        
        byte year = (byte) (year_month >> 1);
        byte month = (byte) (((year_month << 3) | 0b1000) | (month_day >> 5));
        byte day = (byte) (month_day | 0b11111);
        
        fechaDeRegistro.set(year, month, day);
        
        int yearTermino = oi.readByte();
        
        if (yearTermino == -1) {
            fechaDeTermino = null;
        } else {
            fechaDeTermino = (Calendar) Calendar.getInstance();
            fechaDeTermino.set(yearTermino, oi.readByte(), oi.readByte());
        }
        
        byte valorPrioridad = oi.readByte();
        
        for (Prioridad p : Prioridad.values()) {
            if (p.getValue() == valorPrioridad) {
                prioridad = p;
                break;
            }
        }
    }
    
    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Calendar getFechaDeRegistro() {
        return fechaDeRegistro;
    }

    public Calendar getFechaDeTermino() {
        return fechaDeTermino;
    }

    public void setTerminado(boolean terminado) {
        this.fechaDeTermino = terminado ? Calendar.getInstance() : null;
    }

    public Prioridad getPrioridad() {
        return prioridad;
    }

    public void setPrioridad(Prioridad prioridad) {
        this.prioridad = prioridad;
    }
    
    @Override
    public String toString() {
        return String.format("%-30s\t%s", getDescripcion(), getPrioridad());
    }
}